Estoy tratando de poner en marcha un proyecto Django, que depende de la biblioteca GDAL. Estoy trabajando en un Mac basado en M1.
Siguiendo las instrucciones en los documentos oficiales de Django , instalé los paquetes necesarios a través de brew
$ brew install postgresql $ brew install postgis $ brew install gdal $ brew install libgeoip gdalinfo --version funciona bien y muestra la versión como 3.3.1
gdal-config --libs devuelve esta ruta: -L/opt/homebrew/Cellar/gdal/3.3.1_2/lib -lgdal
también se coloca un enlace simbólico en el directorio lib de homebrew, que está en mi variable env de ruta.
Cuando trato de ejecutar django sin especificar la ruta a la biblioteca gdal, se queja de que no puede encontrar el paquete GDAL (aunque se puede acceder a la biblioteca, ya que hay un enlace simbólico disponible a través de la variable path env).
Cuando trato de especificar la ruta a la biblioteca GDAL usando GDAL_LIBRARY_PATH , aparece este error:
OSError: dlopen(/opt/homebrew/Cellar/gdal/3.3.1_2/lib/libgdal.dylib, 6): no suitable image found. Did find: /opt/homebrew/Cellar/gdal/3.3.1_2/lib/libgdal.dylib: mach-o, but wrong architecture /opt/homebrew/Cellar/gdal/3.3.1_2/lib/libgdal.29.dylib: mach-o, but wrong architecturePD: ya he visto esta respuesta , pero no ayudó.
¿No es extraño cuando trato de ejecutar gdalinfo, funciona bien, pero cuando django intenta ejecutarlo, me arroja este error? ¿Qué estoy haciendo mal?
¡Intenta usar la nueva versión arm de python!
brew install --cask miniforge conda init zsh conda activate conda install numpy scipy scikit-learnEs probable que GDAL y Python estén compilados para diferentes arquitecturas de CPU. En un sistema M1, el sistema operativo puede ejecutar binarios arm64 nativos y x86_64 emulados.
Para verificar: ejecute file /opt/homebrew/Cellar/gdal/3.3.1_2/lib/libgdal.dylib y file $(which python3) , que debería mostrar las arquitecturas de CPU admitidas para ambos.
Si los dos no coinciden, tendrá que reinstalar uno de ellos. Tenga en cuenta que si reinstala Python, también debe reinstalar todos los paquetes de Python con extensiones C.
Si no necesita que esto se ejecute de forma nativa en el M1, considere usar una máquina virtual Linux.
Mi solución definitiva a este problema fue crear una VM de Ubuntu usando Multipass de Canonical en mi Mac M1, luego instalar postgresql, postgis y todas las dependencias relevantes, incluido GDAL, como se haría con Linux.
Usé lo siguiente para instalar postgres y postgis:
sudo apt-get install libpq-dev #required for psycop2-binary installation sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list' wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add - sudo apt-get -y install postgresql-13 #or other version number sudo apt install postgis postgresql-13-postgis-3 sudo -i -u postgres createuser yourusername createdb postgis_db -O yourusername #create your db psql -d postgis_db CREATE EXTENSION postgis; #make sure these are all installed: sudo apt-get install binutils libproj-dev sudo apt-get install gdal-bin sudo apt-get install libgeos++ sudo apt-get install proj-binHago SSH en la VM de ubuntu a través de VSCode y desarrollo django como de costumbre. Hay un buen artículo sobre la configuración de Multipass aquí.
No he tenido problemas con esta configuración en M1. ACTUALIZACIÓN: a partir del 10/01/2022, hay algunos problemas con el firewall de MacOS en Monterey 12.1 que no funciona bien con Multipass. Es un problema abierto en GitHub y Canonical está trabajando en ello.
Me encontré con el mismo problema, en mi caso se resolvió agregando GDAL_LIBRARY_PATH en settings.py, pero también GEOS_LIBRARY_PATH
GDAL_LIBRARY_PATH = '/opt/homebrew/Cellar/gdal/3.4.1_1/lib/libgdal.dylib' GEOS_LIBRARY_PATH = '/opt/homebrew/Cellar/geos/3.10.2/lib/libgeos_c.1.16.0.dylib'